import { orderAttrsMap2 } from "./map";

/**
 * 判断url是否是http或https 
 * @param {string} path
 * @returns {Boolean}
 */
export function isHttp(url) {
  return url.indexOf('http://') !== -1 || url.indexOf('https://') !== -1
}

/**
 * 判断path是否为外链
 * @param {string} path
 * @returns {Boolean}
 */
export function isExternal(path) {
  return /^(https?:|mailto:|tel:)/.test(path)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUsername(str) {
  const valid_map = ['admin', 'editor']
  return valid_map.indexOf(str.trim()) >= 0
}

/**
 * @param {string} url
 * @returns {Boolean}
 */
export function validURL(url) {
  const reg = /^(https?|ftp):\/\/([a-zA-Z0-9.-]+(:[a-zA-Z0-9.&%$-]+)*@)*((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]?)(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}|([a-zA-Z0-9-]+\.)*[a-zA-Z0-9-]+\.(com|edu|gov|int|mil|net|org|biz|arpa|info|name|pro|aero|coop|museum|[a-zA-Z]{2}))(:[0-9]+)*(\/($|[a-zA-Z0-9.,?'\\+&%$#=~_-]+))*$/
  return reg.test(url)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validLowerCase(str) {
  const reg = /^[a-z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validUpperCase(str) {
  const reg = /^[A-Z]+$/
  return reg.test(str)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function validAlphabets(str) {
  const reg = /^[A-Za-z]+$/
  return reg.test(str)
}

/**
 * @param {string} email
 * @returns {Boolean}
 */
export function validEmail(email) {
  const reg = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return reg.test(email)
}

/**
 * @param {string} str
 * @returns {Boolean}
 */
export function isString(str) {
  if (typeof str === 'string' || str instanceof String) {
    return true
  }
  return false
}

/**
 * @param {Array} arg
 * @returns {Boolean}
 */
export function isArray(arg) {
  if (typeof Array.isArray === 'undefined') {
    return Object.prototype.toString.call(arg) === '[object Array]'
  }
  return Array.isArray(arg)
}

export const validCalcExpression = (string) => {
  // 剔除空白符
  string = string.replace(/\s/g, "");

  // 替换中文括号
  string = string.replace(/（/g, "(");
  string = string.replace(/）/g, ")");

  // 错误情况，空字符串
  if ("" === string) {
    return false;
  }

  // 错误情况，运算符连续
  if (/[\+\-\*\/×÷]{2,}/.test(string)) {
    return false;
  }

  // 空括号
  if (/\(\)/.test(string)) {
    return false;
  }

  //空中括号
  if (/\[\]/.test(string)) {
    return false;
  }

  //不要出现等于号
  if (/=/.test(string)) {
    return false;
  }

  // 错误情况，括号不配对
  var stack = [];
  for (var i = 0, item; i < string.length; i++) {
    item = string.charAt(i);
    if ("(" === item) {
      stack.push("(");
    } else if (")" === item) {
      if (stack.length > 0) {
        stack.pop();
      } else {
        return false;
      }
    }
  }
  if (0 !== stack.length) {
    return false;
  }

  // 错误情况，中括号不配对
  var stack2 = [];
  for (var i = 0, item; i < string.length; i++) {
    item = string.charAt(i);
    if ("[" === item) {
      stack2.push("[");
    } else if ("]" === item) {
      if (stack2.length > 0) {
        stack2.pop();
      } else {
        return false;
      }
    }
  }
  if (0 !== stack2.length) {
    return false;
  }

  // 错误情况，(后面是运算符
  if (/\([\+\-\*\/×÷]/.test(string)) {
    return false;
  }

  // 错误情况，)前面是运算符
  if (/[\+\-\*\/×÷]\)/.test(string)) {
    return false;
  }

  // 错误情况，[后面是运算符
  if (/\[[\+\-\*\/×÷]/.test(string)) {
    return false;
  }

  // 错误情况，]前面是运算符
  if (/[\+\-\*\/×÷]\]/.test(string)) {
    return false;
  }

  //错误情况，运算符号不能在首末位
  if (/^[\+\-\*\/×÷.]|[\+\-\*\/×÷.]$/.test(string)) {
    return false;
  }

  //错误情况，中括号结尾到下一个开始之间没有运算符
  if (/\]\[/.test(string)) {
    return false;
  }

  //错误情况，出现乱七八糟的字符
  if (/[,.。，？?~！!·`@#￥\$%\^&&——_、\|\\{}:;：；“”""''‘’《》<>]/.test(string)) {
    return false;
  }

  //错误情况，整体不能用中括号包裹，不然正常计算后结果会返回一个数组
  if (/^\[.*\]$/.test(string)) {
    return false;
  }

  //错误情况，不能使用英文字母，避免未预见的XXS攻击
  if (/[a-zA-Z]/.test(string)) {
    return false;
  }

  return true;
};
export const attrNameReg = /数量-右|数量-左|[\u4e00-\u9fa5]+|[0-9]+/g
export const splitFormulaElements = (formula) => {
  let arr = [...formula.matchAll(attrNameReg)]
  let result = []
  arr.forEach((item, index) => {
    result.push(item[0])
    if (index < arr.length - 1) {
      let operator = formula.substring(item.index + item[0].length, arr[index + 1].index)
      if (operator) {
        result.push(operator)
      }
    }
  })
  return result
}
export const validAttrsName = (string) => {
  let attrsName = [...string.matchAll(attrNameReg)].map((e) => e[0]);
  let wrong = "";
  if (
    attrsName.some((attr) => {
      wrong = attr;
      return !Object.values(orderAttrsMap2).includes(attr) && !/[0-9]+/g.test(attr);
    })
  )
    return [false, wrong];
  return [true, ""];
};


